package com.taotao.manage.service;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.github.abel533.entity.Example;
import com.github.abel533.mapper.Mapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.manage.pojo.BasePojo;

public abstract class BaseService<T extends BasePojo> {
	
//	public abstract Mapper<T> getMapper();
	
	// spring4 泛型注入
	@Autowired
	public Mapper<T> mapper;
	
	/**
	 * 查找所有
	 * @return
	 */
	public List<T> queryAll(){
		return this.mapper.select(null);
	}
	
	/**
	 * 根据条件查询多个对象
	 * @param record
	 * @return
	 */
	public List<T> queryListByWhere(T record){
		return this.mapper.select(record);
	}
	
	
	/**
	 * 根据主键查询对象
	 * @param id
	 * @return
	 */
	public T queryById(Object id){
		
		return this.mapper.selectByPrimaryKey(id);
	}
	

	
	/**
	 * 根据条件查询1条数据
	 * @param record
	 * @return
	 */
	public T queryOne(T record){
		return this.mapper.selectOne(record);
	}
	/**
	 * 条件查找数量
	 * @param record
	 * @return
	 */
	public Integer countByWhere(T record){
		return this.mapper.selectCount(record);
	}
	
	/**
	 * 根据条件分页查询
	 * 分页助手
	 */
	public PageInfo<T> queryPageListByWhere(Integer pageNum,Integer pageSize,T record){
		PageHelper.startPage(pageNum, pageSize);
		List<T> list = this.mapper.select(record);
		return new PageInfo<T>(list);
	}
	
	/**
	 * 保存 true成功，false失败
	 * @param record
	 */
	public Boolean save(T record){
		// 添加创建时间
		record.setCreated(new Date());
		// 创建修改时间
		record.setUpdated(record.getCreated());
		// insert方法是使用所有的属性作为字段使用
		// insertSelective 使用不为null的属性
		return this.mapper.insertSelective(record) == 1;
	}
	
	/**
	 * 修改
	 * @param record
	 * @return
	 */
	public Boolean updateByPrimaryKey(T record){
		// 更新修改时间
		record.setUpdated(new Date());
		return this.mapper.updateByPrimaryKeySelective(record) == 1;
	}
	/**
	 * 根据id删除
	 * @param record
	 */
	public Boolean deleteById(Object id){
		return this.mapper.deleteByPrimaryKey(id) == 1;
	}
	
	/**
	 * 根据主键id的集合删除多个对象
	 * @param clazz
	 * @param property
	 * @param ids
	 */
	@SuppressWarnings("rawtypes")
	public Integer deleteByIds(Class clazz,String property,List<Object> ids){
		Example example = new Example(clazz);
		example.createCriteria().andIn(property, ids);
	    return  this.mapper.deleteByExample(example);
	}
	
	/**
	 * 根据条件删除
	 * @param record
	 */
	public Integer deleteByWhere(T record){
		return this.mapper.delete(record);
	}
	
	
	
	

}
